import java.util.ArrayList;

class BMW extends Car {

}

class BENZ extends Car {

}

public class Task {
    public static void main(String[] args) {
        // 目标：掌握泛型方法的定义和使用。
        String rs = test("java");
        System.out.println(rs);

        Dog d = test(new Dog());
        System.out.println(d);

        // 需求：所有的汽车可以一起参加比赛。
        ArrayList<Car> cars = new ArrayList<>();
        cars.add(new BMW());
        cars.add(new BENZ());
        go(cars);

        ArrayList<BMW> bmws = new ArrayList<>();
        bmws.add(new BMW());
        bmws.add(new BMW());
        go(bmws);

        ArrayList<BENZ> benzs = new ArrayList<>();
        benzs.add(new BENZ());
        benzs.add(new BENZ());
        go(benzs);

//        ArrayList<Dog> dogs = new ArrayList<>();
//        dogs.add(new Dog());
//        dogs.add(new Dog());
//        go(dogs);
    }

    /**
     * go方法的
     * 表示参数可以是ArrayList<Car>、或者ArrayList<BMW>、或者ArrayList<BENZ>
     *      ? 通配符，在使用泛型的时候可以代表一切类型
     *      ? extends Car(上限)
     *      ? super Car(下限)
     * @param cars
     */
    public static void go(ArrayList<?> cars) {

    }

    /**
     * go2方法
     * 泛型类型上限设置为Car (通过泛型声明)
     * 使用T来代表泛型的类型
     * @param cars 车的集合
     * @param <T> 所有继承于Car的类型
     */
    public static <T> void go2(ArrayList<T> cars){

    }

    // 泛型方法
    public static <T> T test(T t) {
        return t;
    }
}